commonlibsse_ng_proc_macro_common\skse_plugin_main/
logger.rs

1use quote::quote;
2
3#[cfg(feature = "tracing")]
4#[derive(Debug, Default, darling::FromMeta, PartialEq, Eq)]
5pub(crate) enum LogLevel {
6    #[default]
7    Trace,
8    Debug,
9    Info,
10    Warn,
11    Error,
12}
13
14#[cfg(feature = "tracing")]
15impl LogLevel {
16    fn token(&self) -> proc_macro2::TokenStream {
17        let level = match self {
18            LogLevel::Trace => quote! { TRACE },
19            LogLevel::Debug => quote! { DEBUG },
20            LogLevel::Info => quote! { INFO },
21            LogLevel::Warn => quote! { WARN },
22            LogLevel::Error => quote! { ERROR },
23        };
24
25        quote! { commonlibsse_ng::__private::tracing::level_filters::LevelFilter::#level }
26    }
27}
28
29pub struct LoggerTokenStream {
30    pub init_logger: proc_macro2::TokenStream,
31    pub is_editor_log: proc_macro2::TokenStream,
32}
33
34impl Default for LoggerTokenStream {
35    fn default() -> Self {
36        Self { init_logger: quote! {}, is_editor_log: quote! {} }
37    }
38}
39
40#[cfg(feature = "tracing")]
41pub(crate) fn gen_logger_code(
42    enable_logger: bool,
43    plugin_name: Option<&str>,
44    log_level: LogLevel,
45) -> LoggerTokenStream {
46    let mut code = LoggerTokenStream::default();
47
48    if enable_logger {
49        let plugin_log_name = if let Some(plugin_name) = plugin_name {
50            quote! { concat!(#plugin_name, ".log") }
51        } else {
52            quote! { concat!(env!("CARGO_PKG_NAME"), ".log") }
53        };
54        let err_title = if let Some(plugin_name) = plugin_name {
55            let title = format!("{plugin_name} Error");
56            quote! { #title }
57        } else {
58            quote! {
59                concat!(env!("CARGO_PKG_NAME"), " Error")
60            }
61        };
62        let log_level = log_level.token();
63
64        code.init_logger = quote! {
65            if let Err(err) = commonlibsse_ng::skse::logger::init_with_log_dir(#plugin_log_name, #log_level) {
66                commonlibsse_ng::rex::win32::message_box(#err_title, &err.to_string());
67                std::process::exit(1);
68            };
69            commonlibsse_ng::__private::tracing::info!("Logger has been initialized.");
70        };
71
72        code.is_editor_log = quote! {
73            commonlibsse_ng::__private::tracing::error!("The use of the SKSE Plugin within Editor is not supported.");
74        };
75    };
76
77    code
78}